package com.guaoran.interview.before.jd;

/**
 * @author : guCheng
 * @title : MyBatis 
 * @Description : 
 * 	 
 * @date :2018年3月20日下午11:34:12
 */
public class MyBatis {
	
	/*
	 1、#{}和${}的区别是什么？
		#{}是预编译处理，${}是字符串替换。
		Mybatis在处理#{}时，会将sql中的#{}替换为?号，调用PreparedStatement的set方法来赋值；
		Mybatis在处理${}时，就是把${}替换成变量的值。
		使用#{}可以有效的防止SQL注入，提高系统安全性。
	2.Mapper的缓存
		1.一级缓存是针对SqlSession级别的，默认开启，在SqlSession对象中有一个hashMap来存储缓存数据，
		2.二级缓存是正对mapper级别的，默认关闭的，二级缓存可以对同一个nameSpace中SQLsession是共享的。也是hashmap
	3.一对一、一对多、多对多
		1.一对一；<association 
		2.一对多、多对多：collection 
		
	4.Xml映射文件中，除了常见的select|insert|updae|delete标签之外，还有哪些标签？
		<resultMap>、<parameterMap>、<sql>、<include>、<selectKey>，
		加上动态sql的9个标签，trim|where|set|foreach|if|choose|when|otherwise|bind等，
		其中<sql>为sql片段标签，通过<include>标签引入sql片段，<selectKey>为不支持自增的主键生成策略标签。
		
	5.通常一个Xml映射文件，都会写一个Dao接口与之对应，请问，这个Dao接口的工作原理是什么？
	Dao接口里的方法，参数不同时，方法能重载吗？
		Dao接口，就是人们常说的Mapper接口，接口的全限名，就是映射文件中的namespace的值，
		接口的方法名，就是映射文件中MappedStatement的id值，接口方法内的参数，就是传递给sql的参数。
		Mapper接口是没有实现类的，当调用接口方法时，接口全限名+方法名拼接字符串作为key值，可唯一定位一个MappedStatement，
		举例：com.mybatis3.mappers.StudentDao.findStudentById，可以唯一找到namespace为com.mybatis3.mappers.StudentDao下面id = findStudentById的MappedStatement。
		在Mybatis中，每一个<select>、<insert>、<update>、<delete>标签，都会被解析为一个MappedStatement对象。
		Dao接口里的方法，是不能重载的，因为是全限名+方法名的保存和寻找策略。
		Dao接口的工作原理是JDK动态代理，Mybatis运行时会使用JDK动态代理为Dao接口生成代理proxy对象，
		代理对象proxy会拦截接口方法，转而执行MappedStatement所代表的sql，然后将sql执行结果返回。
		
		
	 */
}
